//
//  MYKRequestManager.h
//  ZFGT
//
//  Created by apple on 2017/12/19.
//  Copyright © 2017年 allyoubank.com. All rights reserved.
//

/**
 http://www.jianshu.com/p/e15592ce40ae
 https://huang303513.github.io/2017/04/14/AFNetWorking源码之NSURLSession系列概述.html
 AFHTTPSessionManager 这个文件是AFURLSessionManager的子类
 */

#import <AFNetworking/AFNetworking.h>
#import "MYKRequestModel.h"

/// 请求成功 数据成功回调
typedef void(^MYKSuccessRequest)(MYKRequestModel *requestModel);

/// 请求成功 数据异常回调
typedef void(^MYKDataErrorRequest)(MYKRequestModel *requestModel);

/// 请求失败回调
typedef void(^MYKFailureRequest)(NSError *error);

/// 如若登录被挤，则发出通知 “Notification_UserShouldLogOut”

//NS_ENUM，定义状态等普通枚举
typedef NS_ENUM(NSUInteger, MYKRequestMethod)
{
    MYKRequestGet = 0,
    MYKRequestPost,
    MYKRequestJson,
};


@interface MYKRequestManager : AFHTTPSessionManager

/// 单例方法
+ (instancetype)sharedManager;

/**
 设置失败时隐藏Tost的属性
 */
+ (void)setToastHidden:(BOOL)hidden;


//MARK: - post网络请求

/**
 *  AF post 请求网络数据，默认请求时间为5s
 *
 *  @params url 接口字段
 *  @params params 请求参数(NSDictionary 形式)
 *  @params success 请求成功 -- 业务成功回调
 *  @params dataError 请求成功 -- 业务失败回调
 *  @params fail 请求失败回调
 */
+ (void)postRequestWithURL:(NSString *)url
                    params:(NSDictionary *)params
            successRequest:(MYKSuccessRequest)success
                 dataError:(MYKDataErrorRequest)dataError
               failRequest:(MYKFailureRequest)fail;
/**
 post 请求 解析data内部数据解析成一个对象
 
 *  @params url 接口字段
 *  @params params 请求参数(NSDictionary 形式)
 *  @param entityClass 要返回的类（如 [UserEntity class] / [NSString class]）
 *  @params success 请求成功 -- 业务成功回调
 *  @params dataError 请求成功 -- 业务失败回调
 *  @params fail 请求失败回调
 */
+ (void)postEntiyWithSubPath:(NSString *)url
                      params:(NSDictionary *)params
                 entityClass:(Class)entityClass
              successRequest:(MYKSuccessRequest)success
                   dataError:(MYKDataErrorRequest)dataError
                 failRequest:(MYKFailureRequest)fail;

/**
 post 请求 解析data内部数据解析成一个数组
 
 *  @params url 接口字段
 *  @params params 请求参数(NSDictionary 形式)
 *  @param entityClass 数组中包含的类（如 [UserEntity class] / [NSString class]）
 *  @params success 请求成功 -- 业务成功回调
 *  @params dataError 请求成功 -- 业务失败回调
 *  @params fail 请求失败回调
 */
+ (void)postArrayWithSubPath:(NSString *)url
                      params:(NSDictionary *)params
                 entityClass:(Class)entityClass
              successRequest:(MYKSuccessRequest)success
                   dataError:(MYKDataErrorRequest)dataError
                 failRequest:(MYKFailureRequest)fail;

//MARK: - get 请求

/**
 *  AF get 请求网络数据，解析data内部数据解析成一个数组
 *
 *  @params url 接口字段
 *  @params params 请求参数(NSDictionary 形式)
 *  @params timeoutInterval 设置请求时间
 *  @params success 请求成功 -- 业务成功回调
 *  @params dataError 请求成功 -- 业务失败回调
 *  @params fail 请求失败回调
 */
+ (void)getRequestWithURL:(NSString *)url
                   params:(NSDictionary *)params
          timeoutInterval:(NSTimeInterval)timeoutInterval
           successRequest:(MYKSuccessRequest)success
                dataError:(MYKDataErrorRequest)dataError
              failRequest:(MYKFailureRequest)fail;

/**
 *  AF get 请求网络数据，手动设置请求时间，单位s
 *
 *  @params url 接口字段
 *  @params params 请求参数(NSDictionary 形式)
 *  @params success 请求成功 -- 业务成功回调
 *  @params dataError 请求成功 -- 业务失败回调
 *  @params fail 请求失败回调
 */
+ (void)getArrayRequestWithURL:(NSString *)url
                        params:(NSDictionary *)params
                   entityClass:(Class)entityClass
                successRequest:(MYKSuccessRequest)success
                     dataError:(MYKDataErrorRequest)dataError
                   failRequest:(MYKFailureRequest)fail;

/**
 *  AF get 请求网络数据，手动设置请求时间，单位s
 *
 *  @params url 接口字段
 *  @params params 请求参数(NSDictionary 形式)
 *  @params timeoutInterval 设置请求时间
 *  @params success 请求成功 -- 业务成功回调
 *  @params dataError 请求成功 -- 业务失败回调
 *  @params fail 请求失败回调
 */
+ (void)getArrayRequestWithURL:(NSString *)url
                        params:(NSDictionary *)params
                   entityClass:(Class)entityClass
               timeoutInterval:(NSTimeInterval)timeoutInterval
                successRequest:(MYKSuccessRequest)success
                     dataError:(MYKDataErrorRequest)dataError
                   failRequest:(MYKFailureRequest)fail;

/**
 get 请求 解析data内部数据解析成一个对象
 
 *  @params url 接口字段
 *  @params params 请求参数(NSDictionary 形式)
 *  @param entityClass 要返回的类（如 [UserEntity class] / [NSString class]）
 *  @params success 请求成功 -- 业务成功回调
 *  @params dataError 请求成功 -- 业务失败回调
 *  @params fail 请求失败回调
 */
+ (void)getEntiyWithSubPath:(NSString *)url
                      params:(NSDictionary *)params
                 entityClass:(Class)entityClass
              successRequest:(MYKSuccessRequest)success
                   dataError:(MYKDataErrorRequest)dataError
                 failRequest:(MYKFailureRequest)fail;


@end
